package com.stlm2.core.redis;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.w3c.dom.Element;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Protocol;


public class RedisClient {

    /**
     * 服务端地址
     */
    private static String host  = null;

    /**
     * 服务端端口号
     */
    private static int port = Protocol.DEFAULT_PORT;

    /**
     * 密码
     */
    private static String password = null;

    private static JedisPool pool = null;

    /**
     * 初始化配置信息
     *
     * @param ele
     */
    public static void parse(Element ele) {
        if(ele == null)
            return ;

        host = ele.getAttribute("host");


        String strPort = ele.getAttribute("port");
        if(StringUtils.isNotBlank(strPort))
            port = NumberUtils.toInt(strPort, port);

        String pwd = ele.getAttribute("password");
        if(StringUtils.isNotBlank(pwd))
            password = pwd;
    }

    public static JedisPool getPool() {
        if (pool != null) {
            return pool;
        }

        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxIdle(50);//最大空闲连接数, 默认8个
        config.setMinIdle(0);//最小空闲连接数, 默认0
        config.setMaxTotal(1000);//最大连接数, 默认8个
        config.setMinEvictableIdleTimeMillis(300000);//逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
        config.setSoftMinEvictableIdleTimeMillis(-1);//对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断  (默认逐出策略)
        config.setNumTestsPerEvictionRun(3);//每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
        config.setTimeBetweenEvictionRunsMillis(60000);//一分钟    //逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
        config.setMaxWaitMillis(15000);//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1
        System.out.println("实例化行的链接");
        pool = new JedisPool(config, host, port, 10000, password);

        return pool;
    }

    public static Jedis getResource(){
        return getPool().getResource();
    }

    public static void returnResource(Jedis jedis){
        getPool().returnResource(jedis);
    }

    public static void returnBrokenResource(Jedis jedis) {
        getPool().returnBrokenResource(jedis);
    }
}